<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>SWIG and C++14</title>
<link rel="stylesheet" type="text/css" href="style.css">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>

<body bgcolor="#ffffff">
<H1><a name="CPlusPlus14">8 SWIG and C++14</a></H1>
<!-- INDEX -->
<div class="sectiontoc">
<ul>
<li><a href="#CPlusPlus14_introduction">Introduction</a>
<li><a href="#CPlusPlus14_core_language_changes">Core language changes</a>
<ul>
<li><a href="#CPlusPlus14_binary_literals">Binary integer literals</a>
<li><a href="#CPlusPlus14_return_type_deduction">Return type deduction</a>
</ul>
<li><a href="#CPlusPlus14_standard_library_changes">Standard library changes</a>
</ul>
</div>
<!-- INDEX -->



<H2><a name="CPlusPlus14_introduction">8.1 Introduction</a></H2>


<p>This chapter gives you a brief overview about the SWIG
implementation of the C++14 standard.
There isn't much in C++14 that affects SWIG, however, work has only just begun on adding
C++14 support.
</p>

<p>
<b>Compatibility note:</b> SWIG-4.0.0 is the first version to support any C++14 features.
</p>

<H2><a name="CPlusPlus14_core_language_changes">8.2 Core language changes</a></H2>


<H3><a name="CPlusPlus14_binary_literals">8.2.1 Binary integer literals</a></H3>


<p>
C++14 added binary integer literals and SWIG supports these.
Example:
</p>

<div class="code">
<pre>
int b = 0b101011;
</pre>
</div>

<H3><a name="CPlusPlus14_return_type_deduction">8.2.2 Return type deduction</a></H3>


<p>
C++14 added the ability to specify <tt>auto</tt> for the return type of a function
and have the compiler deduce it from the body of the function (in C++11 you had
to explicitly specify a trailing return type if you used <tt>auto</tt> for the
return type).
</p>

<p>
SWIG parses these types of functions, but with one significant limitation: SWIG
can't actually deduce the return type!  If you want to wrap such a function
you will need to tell SWIG the return type explicitly.
</p>

<p>
The trick for specifying the return type is to use <tt>%ignore</tt> to tell
SWIG to ignore the function with the deduced return type, but first provide
SWIG with an alternative declaration of the function with an explicit return
type.  The generated wrapper will wrap this alternative declaration, and the
call in the wrapper to the function will call the actual declaration.  Here is
an actual example:
</p>

<div class="code"><pre>
std::tuple&lt;int, int&gt; va_static_cast();
%ignore va_static_cast();
#pragma SWIG nowarn=SWIGWARN_CPP14_AUTO

%inline %{
#include &lt;tuple&gt;

auto va_static_cast() {
    return std::make_tuple(0, 0);
}
%}
</pre></div>

<p>
For member methods the trick is to use <tt>%extend</tt> to redeclare the method and call it as follows:
</p>

<div class="code"><pre>
%extend X {
  const char * a() const { return $self-&gt;a(); }
}
%inline %{
struct X {
  auto a() const {
    return "a string";
  }
};
%}
</pre></div>

<p>
<b>Compatibility note:</b> SWIG-4.2.0 first introduced support for functions declared with an auto return without a trailing return type.
</p>


<H2><a name="CPlusPlus14_standard_library_changes">8.3 Standard library changes</a></H2>


</body>
</html>
